package com.baidu.oa;

import redis.clients.jedis.Jedis;
import sun.java2d.pipe.SpanIterator;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

public class Demo03 {
    private Jedis jedis = new Jedis("192.168.133.118",6379);
    public static void main(String[] args) throws ParseException {
        Demo03 demo03 = new Demo03();
        //第一次访问系统，token是用户访问服务器的唯一标识，此时为空
        boolean isSessionValid = demo03.isSessionValid(null);
        System.out.println("第一次访问系统的session校验结果："
                +(isSessionValid == true? "通过":"不通过"));

        //跳转到登录界面，获取到token
        String token = demo03.login("wmz","123456");
        System.out.println("登录过后拿到令牌："+token);

        //第二次访问系统，拿着令牌过来校验
        isSessionValid = demo03.isSessionValid(token);
        System.out.println("第二次访问系统的session校验结果："
                +(isSessionValid == true? "通过":"不通过"));

    }

    //检验session是否有效
    public boolean isSessionValid(String token) throws ParseException {
        //校验token是否为空
        if (token == null || "".equals(token)){
            return false;
        }

        //这里拿到session可能是一个json字符串
        String session = jedis.hget("sessions",
                "session::" + token);
        if (session == null || "".equals(session)){
            return false;
        }

        //检查一下session是否在有效期内
        String expireTime = jedis.hget("sessions::expire_time",
                "session::"+token);
        if (expireTime == null || "".equals(expireTime)){
            return false;
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date expireTimeDate = dateFormat.parse(expireTime);
        Date now = new Date();
        //如果当前时间大于过期时间，则表示过期
        //after方法比较毫秒值
        if (now.after(expireTimeDate)){
            return false;
        }
        //如果token不为空，session不为空，并且session没过期
        //则可以认为session在有效期内
        return true;
    }


    private String login(String username, String password) {
        Random random = new Random();
        long userId = random.nextInt() * 100;
        System.out.println("基于用户名和密码登录：" + username + ", " + password);
        //登录成功之后，生成一块令牌
        String token = UUID.randomUUID().toString().replace("-", "");
        //基于令牌和用户的id去初始化用户的session
        initSession(userId,token);
        //返回令牌给用户
        return token;
    }

    //用户登陆成功之后，初始化用户的session
    private void initSession(long userId, String token) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //日历类
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.HOUR,24);
        //过期时间为一天之后
        Date expireTime = calendar.getTime();
        //存用户的信息
        jedis.hset("user","username","wmz");
        jedis.hset("sessions",
                "session::"+token,String.valueOf(userId));
        //存session的失效时间
        jedis.hset("sessions::expire_time",
                "session::"+token,dateFormat.format(expireTime));

    }
}
